package routes

import (
	"golang-blog/helper"
	"golang-blog/models"
	"golang-blog/routes/app/v1"
	"net/http"
	"strconv"

	"github.com/gin-gonic/gin"
	"github.com/pkg/errors"
)

// 路由设置

func SetupRouter() *gin.Engine {
	router := gin.Default()
	router.GET("/", func(c *gin.Context) {
		c.HTML(200, "front", nil)
	})

	router.GET("/admin", func(c *gin.Context) {
		c.HTML(200, "admin", nil)
	})

	v1 := router.Group("/blog/v1")
	// 需要鉴权，使用中间件
	// v1.Use(helper.TokenAuthMiddleware(), TokenRoleURLMiddleware())
	v1.Use(helper.TokenAuthMiddleware())
	article := v1.Group("/article")
	{
		article.POST("", app.NewArticle()) // 获取某一文章
		article.GET("", app.GetArticle())
		article.GET("/list", app.GetArticleList())
		article.PUT("", app.UpdateArticle()) // 更新某一文章
		article.DELETE("", app.DeleteArticle())
	}

	// 类别：类别由文章创建时更新维护
	// TODO: 类别可以考虑增加引用；若类别无人使用，则清楚

	// 标签：标签文章创建，删除时自动维护
	tag := v1.Group("/tag")
	{
		tag.GET("/list", app.GetTagList()) // 获取tag列表-tag模糊查询
		tag.GET("")                        // tag详情查询
	}

	// 用户：前端登录；可以考虑增加评论，点赞，留言等功能

	return router
}

// TokenRoleURLMiddleware 判断用户有无url权限
func TokenRoleURLMiddleware() gin.HandlerFunc {
	return func(c *gin.Context) {
		ids := c.GetHeader("id")
		id, _ := strconv.Atoi(ids)
		user, err := models.NewUser(nil).Where(&models.User{ID: int64(id)}).First()
		if err != nil {
			helper.SetHttpMsgResp(c, helper.HttpCodeAuthFail, errors.WithMessage(err, "get user failed").Error())
			c.Abort()
			return
		}

		if user.Status < 0 {
			helper.SetHttpMsgResp(c, helper.HttpCodeAuthFail, errors.New("user status error").Error())
			c.Abort()
			return
		}

		method := c.Request.Method
		if method == http.MethodGet {
			c.Next()
			return
		}
		// 判断用户是否有访问url的权限
		// uri := c.Request.URL.Path
		// url := strings.Join([]string{method, uri}, helper.SplitSep)
		// ok, err := db.IsUserUrlExist(id, url)
		// if err != nil {
		// 	common.Response(c, err, common.QueryDBErr, nil)
		// 	c.Abort()
		// 	return
		// }
		// if !ok {
		// 	common.Response(c, errors.New("permission failed"), common.PermissionErr, nil)
		// 	c.Abort()
		// 	return
		// }
		//logger.Info("role check success")
		c.Next()
	}
}
